/**
* Copyright (c) 2012-2013 Nokia Corporation. All rights reserved.
* Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation. 
* Oracle and Java are trademarks or registered trademarks of Oracle and/or its
* affiliates. Other product and company names mentioned herein may be trademarks
* or trade names of their respective owners. 
* See LICENSE.TXT for license information.
*/
package com.nokia.example.racer.sensor;

import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.sensor.ChannelInfo;
import javax.microedition.sensor.Data;
import javax.microedition.sensor.DataListener;
import javax.microedition.sensor.SensorConnection;
import javax.microedition.sensor.SensorInfo;
import javax.microedition.sensor.SensorManager;

/*
 * Implements AccelerationProvider if sensors are supported.
 */
class AccelerationProviderImpl
    extends AccelerationProvider
    implements DataListener {

    private SensorConnection sensor;
    private int dataType;

    /**
     * AccelerationProviderImpl constructor. Opens connection to the acceleration sensor.
     *
     * @throws IOException
     */
    public AccelerationProviderImpl()
        throws IOException {
        SensorInfo infos[] = SensorManager.findSensors("acceleration", null);
        if (infos.length > 0) {
            dataType = infos[0].getChannelInfos()[0].getDataType();
            try {
                sensor = (SensorConnection) Connector.open(infos[0].getUrl());
                sensor.setDataListener(this, 1);
            }
            catch (SecurityException se) {
                throw new IOException("could not open sensor");
            }
            catch (IOException ioe) {
                throw new IOException("could not open sensor");
            }
            catch (IllegalArgumentException iae) {
                throw new IOException("could not open sensor");
            }
        }
        else {
            throw new IOException("acceleration sensor not found");
        }
    }

    /**
     * Closes the sensor connection.
     */
    public void close() {
        if (sensor != null) {
            sensor.removeDataListener();
            try {
                sensor.close();
                sensor = null;
            }
            catch (IOException ioe) {
                // Nothing to do here.
            }
        }
    }

    /**
     * A method that is called when new sensor data has been received. Delegates data forward.
     * @see javax.microedition.sensor.DataListener#dataReceived(javax.microedition.sensor.SensorConnection, javax.microedition.sensor.Data[], boolean)
     *
     * @param sc
     * @param datas Contains sensor data (x, y, z)
     * @param bln
     */
    public void dataReceived(SensorConnection sc, Data[] datas, boolean bln) {
        switch (dataType) {
            case ChannelInfo.TYPE_DOUBLE:
                final double[] data0 = datas[0].getDoubleValues();
                final double[] data1 = datas[1].getDoubleValues();
                final double[] data2 = datas[2].getDoubleValues();

                dataReceived(data0[data0.length - 1],
                    data1[data1.length - 1],
                    data2[data2.length - 1]);
                break;
            default:
                break;
        }
    }
}
